package com.cardcaptorsakura.repository;

import com.cardcaptorsakura.model.entity.UserPreference;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 用户偏好仓库接口
 * 提供用户偏好数据的CRUD操作
 */
@Repository
public interface UserPreferenceRepository extends MongoRepository<UserPreference, String> {

    /**
     * 根据用户ID查找偏好设置
     */
    Optional<UserPreference> findByUserId(String userId);

    /**
     * 检查用户偏好是否存在
     */
    boolean existsByUserId(String userId);

    /**
     * 根据用户ID删除偏好设置
     */
    void deleteByUserId(String userId);

    /**
     * 查找启用了特定语言的用户
     */
    @Query("{'languagePreference.primaryLanguage': ?0}")
    List<UserPreference> findByPrimaryLanguage(String language);

    /**
     * 查找启用了自动语言检测的用户
     */
    @Query("{'languagePreference.autoDetectLanguage': true}")
    List<UserPreference> findUsersWithAutoLanguageDetection();

    /**
     * 查找启用了翻译功能的用户
     */
    @Query("{'languagePreference.enableTranslation': true}")
    List<UserPreference> findUsersWithTranslationEnabled();

    /**
     * 查找使用特定默认人格的用户
     */
    @Query("{'personaPreference.defaultPersonaId': ?0}")
    List<UserPreference> findByDefaultPersonaId(String personaId);

    /**
     * 查找收藏了特定人格的用户
     */
    @Query("{'personaPreference.favoritePersonaIds': {$in: [?0]}}")
    List<UserPreference> findByFavoritePersonaId(String personaId);

    /**
     * 查找启用了自动人格切换的用户
     */
    @Query("{'personaPreference.autoSwitchPersona': true}")
    List<UserPreference> findUsersWithAutoPersonaSwitchEnabled();

    /**
     * 查找启用了人格学习的用户
     */
    @Query("{'personaPreference.allowPersonaLearning': true}")
    List<UserPreference> findUsersWithPersonaLearningEnabled();

    /**
     * 查找使用特定响应速度偏好的用户
     */
    @Query("{'interactionPreference.responseSpeed': ?0}")
    List<UserPreference> findByResponseSpeed(String responseSpeed);

    /**
     * 查找使用特定回复长度偏好的用户
     */
    @Query("{'interactionPreference.responseLength': ?0}")
    List<UserPreference> findByResponseLength(String responseLength);

    /**
     * 查找启用了上下文记忆的用户
     */
    @Query("{'interactionPreference.enableContextMemory': true}")
    List<UserPreference> findUsersWithContextMemoryEnabled();

    /**
     * 查找启用了个性化建议的用户
     */
    @Query("{'interactionPreference.enablePersonalizedSuggestions': true}")
    List<UserPreference> findUsersWithPersonalizedSuggestionsEnabled();

    /**
     * 查找对特定主题感兴趣的用户
     */
    @Query("{'contentPreference.interestedTopics': {$in: [?0]}}")
    List<UserPreference> findByInterestedTopic(String topic);

    /**
     * 查找启用了内容过滤的用户
     */
    @Query("{'contentPreference.enableContentFiltering': true}")
    List<UserPreference> findUsersWithContentFilteringEnabled();

    /**
     * 查找使用特定内容过滤级别的用户
     */
    @Query("{'contentPreference.contentFilterLevel': ?0}")
    List<UserPreference> findByContentFilterLevel(String filterLevel);

    /**
     * 查找特定年龄组的用户
     */
    @Query("{'contentPreference.ageGroup': ?0}")
    List<UserPreference> findByAgeGroup(String ageGroup);

    /**
     * 查找启用了通知的用户
     */
    @Query("{'notificationPreference.enableNotifications': true}")
    List<UserPreference> findUsersWithNotificationsEnabled();

    /**
     * 查找启用了特定通知类型的用户
     */
    @Query("{'notificationPreference.notificationTypes.?0': true}")
    List<UserPreference> findByNotificationTypeEnabled(String notificationType);

    /**
     * 查找启用了免打扰模式的用户
     */
    @Query("{'notificationPreference.doNotDisturbMode': true}")
    List<UserPreference> findUsersWithDoNotDisturbEnabled();

    /**
     * 查找同意数据收集的用户
     */
    @Query("{'privacyPreference.dataCollectionConsent': true}")
    List<UserPreference> findUsersWithDataCollectionConsent();

    /**
     * 查找同意个性化的用户
     */
    @Query("{'privacyPreference.personalizationConsent': true}")
    List<UserPreference> findUsersWithPersonalizationConsent();

    /**
     * 查找同意分析的用户
     */
    @Query("{'privacyPreference.analyticsConsent': true}")
    List<UserPreference> findUsersWithAnalyticsConsent();

    /**
     * 查找使用特定隐私级别的用户
     */
    @Query("{'privacyPreference.privacyLevel': ?0}")
    List<UserPreference> findByPrivacyLevel(String privacyLevel);

    /**
     * 查找使用特定主题的用户
     */
    @Query("{'uiPreference.theme': ?0}")
    List<UserPreference> findByTheme(String theme);

    /**
     * 查找使用特定字体大小的用户
     */
    @Query("{'uiPreference.fontSize': ?0}")
    List<UserPreference> findByFontSize(String fontSize);

    /**
     * 查找启用了动画效果的用户
     */
    @Query("{'uiPreference.enableAnimations': true}")
    List<UserPreference> findUsersWithAnimationsEnabled();

    /**
     * 查找使用紧凑模式的用户
     */
    @Query("{'uiPreference.compactMode': true}")
    List<UserPreference> findUsersWithCompactModeEnabled();

    /**
     * 查找启用了自动播放音频的用户
     */
    @Query("{'mediaPreference.autoPlayAudio': true}")
    List<UserPreference> findUsersWithAutoPlayAudioEnabled();

    /**
     * 查找启用了自动播放视频的用户
     */
    @Query("{'mediaPreference.autoPlayVideo': true}")
    List<UserPreference> findUsersWithAutoPlayVideoEnabled();

    /**
     * 查找使用特定音频质量的用户
     */
    @Query("{'mediaPreference.audioQuality': ?0}")
    List<UserPreference> findByAudioQuality(String audioQuality);

    /**
     * 查找启用了字幕的用户
     */
    @Query("{'mediaPreference.enableSubtitles': true}")
    List<UserPreference> findUsersWithSubtitlesEnabled();

    /**
     * 查找启用了数据节省模式的用户
     */
    @Query("{'mediaPreference.dataSaverMode': true}")
    List<UserPreference> findUsersWithDataSaverModeEnabled();

    /**
     * 查找使用特定学习风格的用户
     */
    @Query("{'learningPreference.learningStyle': ?0}")
    List<UserPreference> findByLearningStyle(String learningStyle);

    /**
     * 查找使用特定学习速度的用户
     */
    @Query("{'learningPreference.learningPace': ?0}")
    List<UserPreference> findByLearningPace(String learningPace);

    /**
     * 查找启用了自适应学习的用户
     */
    @Query("{'learningPreference.enableAdaptiveLearning': true}")
    List<UserPreference> findUsersWithAdaptiveLearningEnabled();

    /**
     * 查找启用了进度跟踪的用户
     */
    @Query("{'learningPreference.enableProgressTracking': true}")
    List<UserPreference> findUsersWithProgressTrackingEnabled();

    /**
     * 查找启用了成就系统的用户
     */
    @Query("{'learningPreference.enableAchievements': true}")
    List<UserPreference> findUsersWithAchievementsEnabled();

    /**
     * 查找有特定学习目标的用户
     */
    @Query("{'learningPreference.learningGoals': {$in: [?0]}}")
    List<UserPreference> findByLearningGoal(String learningGoal);

    /**
     * 查找最近更新的偏好设置
     */
    List<UserPreference> findByUpdatedAtAfter(LocalDateTime since);

    /**
     * 查找特定版本的偏好设置
     */
    List<UserPreference> findByVersion(Integer version);

    /**
     * 查找版本大于指定值的偏好设置
     */
    List<UserPreference> findByVersionGreaterThan(Integer version);

    /**
     * 统计用户偏好总数
     */
    long count();

    /**
     * 统计使用特定语言的用户数量
     */
    @Query(value = "{'languagePreference.primaryLanguage': ?0}", count = true)
    long countByPrimaryLanguage(String language);

    /**
     * 统计启用了通知的用户数量
     */
    @Query(value = "{'notificationPreference.enableNotifications': true}", count = true)
    long countUsersWithNotificationsEnabled();

    /**
     * 统计同意数据收集的用户数量
     */
    @Query(value = "{'privacyPreference.dataCollectionConsent': true}", count = true)
    long countUsersWithDataCollectionConsent();

    /**
     * 统计使用特定主题的用户数量
     */
    @Query(value = "{'uiPreference.theme': ?0}", count = true)
    long countByTheme(String theme);

    /**
     * 统计启用了自适应学习的用户数量
     */
    @Query(value = "{'learningPreference.enableAdaptiveLearning': true}", count = true)
    long countUsersWithAdaptiveLearningEnabled();

    /**
     * 批量查找用户偏好
     */
    List<UserPreference> findByUserIdIn(List<String> userIds);

    /**
     * 查找需要迁移的旧版本偏好设置
     */
    @Query("{'version': {$lt: ?0}}")
    List<UserPreference> findOldVersionPreferences(Integer currentVersion);

    /**
     * 查找长时间未更新的偏好设置
     */
    @Query("{'updatedAt': {$lt: ?0}}")
    List<UserPreference> findStalePreferences(LocalDateTime threshold);

    /**
     * 查找有扩展属性的偏好设置
     */
    @Query("{'metadata': {$exists: true, $ne: null}}")
    List<UserPreference> findPreferencesWithMetadata();

    /**
     * 查找特定扩展属性的偏好设置
     */
    @Query("{'metadata.?0': {$exists: true}}")
    List<UserPreference> findByMetadataKey(String key);

    /**
     * 查找特定扩展属性值的偏好设置
     */
    @Query("{'metadata.?0': ?1}")
    List<UserPreference> findByMetadataKeyValue(String key, Object value);
}